import { Point } from './types'


export const getSizeFromPoints = (points: readonly Point[]) => {
  const xs = points.map((point) => point[0])
  const ys = points.map((point) => point[1])
  return {
    width: Math.max(...xs) - Math.min(...xs),
    height: Math.max(...ys) - Math.min(...ys),
  }
}

/** @arg dimension, 0 for rescaling only x, 1 for y */
export const rescalePoints = (
  dimension: 0 | 1,
  newSize: number,
  points: readonly Point[],
  normalize: boolean,
): Point[] => {
  const coordinates = points.map((point) => point[dimension])
  const maxCoordinate = Math.max(...coordinates)
  const minCoordinate = Math.min(...coordinates)
  const size = maxCoordinate - minCoordinate
  const scale = size === 0 ? 1 : newSize / size

  let nextMinCoordinate = Infinity

  const scaledPoints = points.map((point): Point => {
    const newCoordinate = point[dimension] * scale
    const newPoint = [...point]
    newPoint[dimension] = newCoordinate
    if (newCoordinate < nextMinCoordinate) {
      nextMinCoordinate = newCoordinate
    }
    return newPoint as unknown as Point
  })

  if (!normalize) {
    return scaledPoints
  }

  if (scaledPoints.length === 2) {
    // we don't translate two-point lines
    return scaledPoints
  }

  const translation = minCoordinate - nextMinCoordinate

  const nextPoints = scaledPoints.map(
    (scaledPoint) =>
      scaledPoint.map((value, currentDimension) => {
        return currentDimension === dimension ? value + translation : value
      }) as [number, number],
  )
  return nextPoints
}
